home *** CD-ROM | disk | FTP | other *** search
-
- {***************************************************}
- { }
- { Turbo Pascal for Windows }
- { Windows 3.1 Common Dialogs Demo Program }
- { }
- { Copyright (c) 1992 by Borland International }
- { modifications for tCommonDlg object by }
- {%% Juancarlo A±ez }
- {%% [73000, 1064] }
- {%% August 1992 }
- { }
- {***************************************************}
-
-
- PROGRAM CommDlgs;
-
- { This program demonstrates the use of several new Windows 3.1
- features: The Common Dialogs (for Font and Color selection),
- True Type, and Playing sounds.
- }
-
- {%% THIS PROGRAM ALSO SHOWS HOW TO USE THE tCommonDlg OBJECT AND ITS
- DESCENDANTS, AND THE PRN31 UNIT, A WIN 3.1 AWARE VERSION OF
- PRINTER.PAS IN CIS LIB 8
-
- I TESTED THIS APP WITH THE FOLOWING OPTIONS
- }
- {$A+,B-,D+,F-,G+,I+,L+,N+,R+,S+,V-,W-,X+}
-
- USES
- WinCrt,
- WinDos,
- Strings,
- WinTypes,
- WinProcs,
- WObjects,
- CommDlg,
- MMSystem,
- BWCC,
-
- {following units added by me
- {
- \\\
- -(j)-
- /juanca
- }
- ComonDlg,
- fNameDlg, { tFileNameDlg OBJECT }
- FontDlg,
- MyPrn_, { tMyPrinter OBJECT that uses BWCC}
- MyOpen_, { tMyOpenDlg OBJECT that uses BWCC}
- UsrWin_,
- Port_
- ;
-
- {
- \\\
- -(j)-
- /juanca
- }
- {changed resource file }
- {$R COMOSAMP }
- {$I CDLG.INC } {just some little id_...Whatever }
-
- const
-
- { Resource IDs }
-
- id_Menu = 100;
- id_About = 100;
- id_Icon = 100;
-
- { Menu command IDs }
-
- cm_FileOpen = 101;
- cm_Color = 103;
- cm_Font = 104;
-
-
- {
- \\\
- -(j)-
- /juanca
- }
- {new commands }
- cm_FilePrint = 110;
- cm_FilePrinterSetup = 111;
- cm_FileUseBWCC = 112;
-
- { Other Constants }
-
- FlagWidth = 251;
- FlagHeight = 180;
-
- type
-
- { Filename string }
-
- TFilename = array [0..255] of Char;
-
- { Application main window }
-
- PCommDlgsWindow = ^TCommDlgsWindow;
- TCommDlgsWindow = Object(tUsrWin) {base type changed to tUsrWin }
- { \\\ }
- fontPointsBy10 :Longint; { -(j)- }
- ALogFont : TLogFont; { /juanca }
- ColorRef : LongInt;
- myPrinter : tMyPrinter;
- useBWCC : Boolean;
-
- constructor Init(AParent: PWindowsObject; AName: PChar);
- destructor Done; virtual;
-
- procedure MakeDefaultFont;
- procedure SetupWindow; virtual;
-
- {
- \\\
- -(j)-
- /juanca
- }
- { removed the paint method, now use upaint thats compatible with printing}
- procedure
- upaint(dc :pPort; bound :tRect; erased :Boolean);
- virtual;
-
- procedure CMColor(var Msg: TMessage);
- virtual cm_First + cm_Color;
- procedure CMFileOpen(var Msg: TMessage);
- virtual cm_First + cm_FileOpen;
- procedure CMFonts(var Msg: TMessage);
- virtual cm_First + cm_Font;
-
- {
- \\\
- -(j)-
- /juanca
- }
- { new commands }
- procedure
- CMFilePrint(var msg :tMessage);
- virtual
- cm_First+cm_FilePrint;
- procedure
- CMFilePrinterSetup(var msg :tMessage);
- virtual
- cm_First+cm_FilePrinterSetup;
- procedure
- CMFileUseBWCC(var msg :tMessage);
- virtual
- cm_First+cm_FileUseBWCC;
- END; {tCommonDlgsWindow }
-
- { Application object }
-
- PCommDlgApp = ^TCommDlgApp;
- TCommDlgApp = Object(TApplication)
- procedure InitMainWindow; virtual;
- end;
-
-
-
-
- { Initialized globals }
-
- const
- DemoTitle: PChar = 'Common Dialogs Demo';
-
- { Global variables }
-
- var
- App: TCommDlgApp;
-
-
-
- {
- \\\
- -(j)-
- /juanca
- }
- {NOTICE THIS FUNCTION
- it takes a tLogFont *as value parameter* (no changes to original) and
- creates a GDI font object adecuate for the DeviceContext
- taking a PointSize x 10 parameter
- }
- FUNCTION
- createFontInPointsForDC(hdc :tHandle; px10Size :Word; lfont :tLogFont):tHandle;
- begin
- lFont.lfHeight := -(px10Size*getDeviceCaps(hdc, LOGPIXELSY)) div 720;
- createFontInPointsForDC := createFontIndirect(lFont);
- end;
-
-
- { TCommDlgsWindow Methods }
-
- { Constructs an instance of TCommDlgsWindow. Loads the menu and
- initialize the wave file's "FileName" and the text's initial RGB
- color value.
- }
- constructor TCommDlgsWindow.Init(AParent: PWindowsObject; AName: PChar);
- begin
- tUsrWin.Init(AParent, AName);
- Attr.Menu:= LoadMenu(HInstance, PChar(id_Menu));
-
- ColorRef := RGB(0, 0, 255);
- fontPointsBy10 := 720;
- myPrinter.init;
- useBWCC := FALSE;
- end;
-
- { Destroys an instance of the TCommDlgsWindow by disposing of its
- "FlagMap" image and Font. Then calls on ancestral destructor to
- complete the shutdown.
- }
- destructor TCommDlgsWindow.Done;
- begin
- myPrinter.done;
- tUsrWin.Done;
- end;
-
- { Sets up an Italic, Times New Roman, font handle used as the default
- Font by TCommDlgsWindow in its Paint method.
- }
- procedure TCommDlgsWindow.MakeDefaultFont;
- begin
- FillChar(ALogFont, SizeOf(TLogFont), #0);
- with ALogFont do
- begin
- lfHeight := 96; {Make a large font }
- lfWeight := 700; {Indicate a Bold attribute }
- lfItalic := 1; {Non-zero value indicates italic }
- lfUnderline := 1; {Non-zero value indicates underline}
- lfOutPrecision := Out_Stroke_Precis;
- lfClipPrecision := Clip_Stroke_Precis;
- lfQuality := Default_Quality;
- lfPitchAndFamily:= Variable_Pitch;
- StrCopy(lfFaceName, 'Times New Roman');
- end;
- end;
-
- { Establishes the font and the "FlagMap" bitmap image used in
- TCommDlgsWindow's Paint method. The FlagMap is held as an instance
- variable until the window is closed.
- }
- procedure TCommDlgsWindow.SetUpWindow;
- begin
- tUsrWin.SetupWindow;
- MakeDefaultFont;
- end;
-
- { Displays the bitmap held in "FlagMap". Then surrounds this flag map
- with the string 'TP Win 3.1' in the selected font and text color.
- }
- procedure TCommDlgsWindow.upaint(dc :pPort; bound :tRect; erased :Boolean);
- var
- S : array [0..100] of Char;
- paintDC : HDC;
- Dims : LongInt;
- oldFont,
- font : tHandle;
- begin
- paintDC := dc^.context;
-
- { formula for calculating fontHeight for WYSYWIG,
- size := -(PIXELSxINCH * Points)/72 }
- font := createFontInPointsForDC(paintDC, fontPointsBy10, aLogFont);
-
- StrCopy(S, 'TP ');
- oldFont := SelectObject(PaintDC, font);
- SetTextColor(PaintDC, ColorRef);
- TextOut(PaintDC, 0, 0, S, StrLen(S));
- Dims := GetTextExtent(PaintDC, S, StrLen(S));
-
-
- StrCopy(S, ' Win 3.1');
- TextOut(PaintDC, (LoWord(Dims) ), 0, S, StrLen(S));
-
- deleteObject(selectObject(paintDC, oldFont));
- end;
-
- { Displays the "Open File Dialog" from Common dialogs and permit the user
- to select from among the available Wave files. Then play the sound
- found in the file using "SndPlaySound".
- }
- procedure TCommDlgsWindow.CMFileOpen(var Msg: TMessage);
- var
- {
- \\\
- -(j)-
- /juanca
- }
- { removed declarations }
- {$ifdef NOT_NEEDED}
- OpenFN : TOpenFileName;
- Filter : array [0..100] of Char;
- FullFileName: TFilename;
- {$endif}
- WinDir : array [0..145] of Char;
- dlg :pMyOpenDlg;
- begin
- GetWindowsDirectory(WinDir, SizeOf(WinDir));
- SetCurDir(WinDir);
-
- if useBWCC
- then
- dlg := new(pMyOpenDlg, init(@Self, 'OPEN_DLG', TRUE)) { TRUE means OpenDlg, FALSE SaveAsDlg }
- else
- dlg := new(pMyOpenDlg, init(@Self, nil, TRUE)); { TRUE means OpenDlg, FALSE SaveAsDlg }
- if dlg <> nil
- then begin
- if (dlg^.execute = idOk)
- then
- with dlg^, openFileName
- do begin
- if strComp(filePath+nFileExtension, 'WAV') = 0
- then
- SndPlaySound(dlg^.filePath, 1); {Second parameter must be 1}
- case option
- of
- id_Superb :
- messageBox( hwindow,
- 'So you like my dialogs...Thanks :->',
- 'Juanca',
- mb_IconExclamation or mb_Ok);
- id_JustOk :
- messageBox( hwindow,
- 'My Dlg''s are just ok?'#10+
- 'Well...I diddn''t really work too hard onthem :-)',
- 'Juanca',
- mb_IconQuestion or mb_Ok);
- id_YourOwn:
- messageBox( hwindow,
- 'If you don''t like theese...'#10+
- 'Better go for it...start writing your own Common Dlgs :-\',
- 'Juanca',
- mb_IconStop or mb_Ok);
- end
- end;
- dlg^.free
- end
- end;
-
- { Displays the "Choose Color" dialog from the common dialogs unit.
- Permits an initial value to be inserted and custom colors to be
- developed. Note, custom colors are not used by the "ChooseFont"
- dialog from common dialogs.
- }
- procedure TCommDlgsWindow.CMColor(var Msg: TMessage);
- type
- TLongAry = array [0..15] of Longint;
- const
- { Establishes a set of custom colors in 15 shades of blue }
- CustColors: TLongAry = (
- $000000, $100000, $200000, $300000,
- $400000, $500000, $600000, $700000,
- $800000, $900000, $A00000, $B00000,
- $C00000, $D00000, $E00000, $F00000);
- var
- ChooseClr: TChooseColor;
- i : Integer;
- begin
- with ChooseClr do
- begin
- HWndOwner := HWindow;
- lStructSize := Sizeof(TChooseColor);
- rgbResult := ColorRef;
- lpCustColors:= @CustColors;
- Flags := cc_FullOpen or cc_RGBInit;
- {Allow custom colors and the initialization through rgbResult}
- end;
- if not ChooseColor(ChooseClr) then
- Exit;
- ColorRef := ChooseClr.RGBResult;
- InvalidateRect(HWindow, nil, True);
- end;
-
- { Displays the ChooseFont dialog to permit the selection of a font which
- is returned as a TLogFont. Then a font handle is created from this
- logical font information.
- }
- procedure TCommDlgsWindow.CMFonts(var Msg: TMessage);
- var
- ChooseRec: TChooseFont;
- Colors : LongInt;
- Style : array [0..100] of Char;
- TempFont : TLogFont;
- result : Longint;
- cfdlg : pChooseFontDlg;
- begin
- FillChar(ChooseRec, SizeOf(ChooseRec), #0);
- with ChooseRec do
- begin
- lStructSize:= SizeOf(TChooseFont);
- hdc := myPrinter.context;
- lpLogFont := @ALogFont;
- Flags := cf_Both or cf_WYSIWYG or cf_Effects or cf_InitToLogFontStruct;
- rgbColors := ColorRef;
- lpszStyle := Style;
- iPointSize := fontPointsBy10;
- end;
-
-
- {
- \\\
- -(j)-
- /juanca
- }
- { this is the easy way to change the dialog "look"}
- if useBWCC
- then begin
- cfdlg := new(pChooseFontDlg, init(@Self, 'CHOOSEF_31', @chooseRec));
- if (cfdlg = nil) or (cfdlg^.execute <> id_Ok)
- then
- Exit;
- end
- else if not ChooseFont(ChooseRec)
- then begin
- result := CommDlgExtendedError; { juanca: this is so you can wath with a debugger }
- Exit;
- end;
-
- { Update the Font and Color data fields, then cause the window to be
- repainted.
- }
- ColorRef:= ChooseRec.rgbColors;
- fontPointsBy10 := chooseRec.iPointSize;
- InvalidateRect(HWindow, nil, True);
- end;
-
-
- procedure
- TCommDlgsWindow.
- {}
- CMFilePrint(var msg :tMessage);
- begin
- myPrinter.print(@self, 'JUANCA')
- end;
-
- procedure
- TCommDlgsWindow.
- {}
- CMFilePrinterSetup(var msg :tMessage);
- begin
- myPrinter.setup(@self)
- end;
-
- procedure
- TCommDlgsWindow.
- {}
- CMFileUseBWCC(var msg :tMessage);
- begin
- useBWCC := not useBWCC;
- if useBWCC
- then
- checkMenuItem(attr.menu, cm_FileUseBWCC, mf_ByCommand or mf_Checked)
- else
- checkMenuItem(attr.menu, cm_FileUseBWCC, mf_ByCommand);
- myPrinter.setBWCCUse(useBWCC)
- end;
-
-
- { TCommDlgApp Methods }
-
- procedure TCommDlgApp.InitMainWindow;
- begin
- MainWindow := New(PCommDlgsWindow, Init(nil, Application^.Name));
- end;
-
-
- { Main program }
-
- begin
- App.Init(DemoTitle);
- App.Run;
- App.Done;
- end.
-